From fcb3c0591c1e55f049d255f55a51606eac53fb10 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Thu, 30 Nov 2006 15:57:55 -0700 Subject: [PATCH] [IA64] Fix failure when Xen is booted with "nomca" Based on patch from Kazuhiro Suzuki Signed-off-by: Alex williamson --- xen/arch/ia64/linux-xen/mca.c | 17 ++++++++++------- xen/arch/ia64/xen/fw_emul.c | 2 +- xen/include/asm-ia64/xenmca.h | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/xen/arch/ia64/linux-xen/mca.c b/xen/arch/ia64/linux-xen/mca.c index cf43c17cb8..8715ef1d5e 100644 --- a/xen/arch/ia64/linux-xen/mca.c +++ b/xen/arch/ia64/linux-xen/mca.c @@ -206,8 +206,8 @@ static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES]; #define IA64_LOG_COUNT(it) ia64_state_log[it].isl_count #ifdef XEN -struct list_head sal_queue[IA64_MAX_LOG_TYPES]; -sal_log_record_header_t *sal_record = NULL; +struct list_head *sal_queue, sal_log_queues[IA64_MAX_LOG_TYPES]; +sal_log_record_header_t *sal_record; DEFINE_SPINLOCK(sal_queue_lock); #endif @@ -1606,7 +1606,7 @@ ia64_mca_cpu_init(void *cpu_data) } } #ifdef XEN - else { + else if (sal_queue) { int i; for (i = 0; i < IA64_MAX_LOG_TYPES; i++) ia64_log_queue(i, 0); @@ -1811,10 +1811,13 @@ ia64_mca_init(void) ia64_log_init(SAL_INFO_TYPE_CPE); #ifdef XEN - INIT_LIST_HEAD(&sal_queue[SAL_INFO_TYPE_MCA]); - INIT_LIST_HEAD(&sal_queue[SAL_INFO_TYPE_INIT]); - INIT_LIST_HEAD(&sal_queue[SAL_INFO_TYPE_CMC]); - INIT_LIST_HEAD(&sal_queue[SAL_INFO_TYPE_CPE]); + INIT_LIST_HEAD(&sal_log_queues[SAL_INFO_TYPE_MCA]); + INIT_LIST_HEAD(&sal_log_queues[SAL_INFO_TYPE_INIT]); + INIT_LIST_HEAD(&sal_log_queues[SAL_INFO_TYPE_CMC]); + INIT_LIST_HEAD(&sal_log_queues[SAL_INFO_TYPE_CPE]); + + /* NULL sal_queue used elsewhere to determine MCA init state */ + sal_queue = sal_log_queues; open_softirq(CMC_DISABLE_SOFTIRQ, (softirq_handler)ia64_mca_cmc_vector_disable); diff --git a/xen/arch/ia64/xen/fw_emul.c b/xen/arch/ia64/xen/fw_emul.c index 6dc9ea4f8a..e539224cd2 100644 --- a/xen/arch/ia64/xen/fw_emul.c +++ b/xen/arch/ia64/xen/fw_emul.c @@ -214,7 +214,7 @@ sal_emulator (long index, unsigned long in1, unsigned long in2, struct smp_call_args_t arg; spin_lock_irqsave(&sal_queue_lock, flags); - if (list_empty(&sal_queue[in1])) { + if (!sal_queue || list_empty(&sal_queue[in1])) { sal_log_record_header_t header; XEN_GUEST_HANDLE(void) handle = *(XEN_GUEST_HANDLE(void)*)&in3; diff --git a/xen/include/asm-ia64/xenmca.h b/xen/include/asm-ia64/xenmca.h index c541b237be..653253e8fd 100644 --- a/xen/include/asm-ia64/xenmca.h +++ b/xen/include/asm-ia64/xenmca.h @@ -21,7 +21,7 @@ typedef struct sal_queue_entry_t { struct list_head list; } sal_queue_entry_t; -extern struct list_head sal_queue[]; +extern struct list_head *sal_queue; struct ia64_mca_tlb_info { u64 cr_lid; -- 2.30.2